#pragma once
#include "FileUtil.hpp"
#include <unordered_map>

namespace Cloude
{
	/*
		对需要备份的文件夹做数据管理：
			对什么数据做管理？ 对已经备份的文件做管理
			如何标识文件？文件名
			如何管理？ 我们这里哈希表去管理，使用key-val形式，key文件名，val 文件的唯一标识
					   未来这个唯一标识是 文件名+大小+最近修改时间
		持久化：
			将保存到指定的文件中，管理的数据(哈希表中的数据)进行保存到文件中
			因为vs2019中没有jsoncpp库，下载太麻烦，所以我们就自定义协议去存储
			协议如下：
			key val\nkey val\n...
	*/
	using std::string;
	class DataManager
	{
	private:
		std::unordered_map<string, string> _table;
		// 备份信息存放的文件
		string _data_file;

	public:
		DataManager(const string& data_file)
			:_data_file(data_file)
		{
			Load();
		}
		void Print()
		{
			for (auto& [k, v] : _table)
			{
				cout << k << " " << v << endl;
			}
		}

		void Load()
		{
			// 1.从文件中获取备份信息
			FileUtil fd(_data_file);
			string str;
			if (fd.GetContent(&str) == false)
			{
				cout << "DataManager::Load GetContent failed.." << endl;
				return;
			}
			if (str.size() == 0)
				return;
			// 2.反序列化，使用stringstream做格式化控制
			std::stringstream  ss(str);
			string key;
			string val;
			while (ss >> key)
			{
				if (!(ss >> val))
					break;
				_table[key] = val;
			}
		}
		void Stroe()
		{
			// 1. 序列化
			std::stringstream ss;
			for (auto& [k,v] : _table)
			{
				ss << k << " " << v << "\n";
			}
			// 2. 保存
			string str;
			str = ss.str();
			FileUtil fd(_data_file);
			fd.SetContent(str);
			std::cout << "sava successful " << endl;
		}
		bool Insert(const string& filename, const string& file_id)
		{
			//这里不是服务器，是不需要多线程的
			_table[filename] = file_id;
			Stroe();
			return true;
		}
		bool UpDate(const string& filename, const string& file_id)
		{
			_table[filename] = file_id;
			Stroe();
			return true;
		}
		// 这里给的名字是带路径的，windows与linux的路径分隔符不兼容！！
		bool GetIdByFileName(const string& filename, string* file_id)
		{
			if (_table.count(filename) == 0)
				return false;
			*file_id = _table[filename];
			return true;
		}


	};
}
